/***********************************************************************************
 * 文件名： mcu_spi.h
 * 作者： 刘言
 * 版本： 1
 * 说明：
 * 		CST92F25 的 SPI 驱动。CST92F25 虽然有2个SPI，但是同一时刻只能有1个SPI工作，故没有必
 *  要使用另一个SPI，看作是只有1个SPI的MCU，多器件连接时使用片选选择器件即可。
 *      仅配置 SPI0 外设，需要自行配置管脚映射，仅支持 SPI0 ，注意正确配置管脚映射。
 *      仅实现了主机模式。硬件支持从机模式。
 * 修改记录：
 * 	2022/10/10: 初版。 刘言。
***********************************************************************************/
#ifndef _MCU_SPI_H_
#define _MCU_SPI_H_

#include "..\ARM\typedef.h"

#if (_SPI_USE_ASNYC)

typedef enum _spi_event
{
    SPI_EV_NONE,
    SPI_EV_TRANS_COMPLETED,
    SPI_EV_RX_DATA  // 从机模式才有
}spi_event_t;


typedef void (*spi_cb_t)(spi_event_t e);

#endif

#if (_SPI_USE_ASNYC && (_SPI_EN_DMA_TX || _SPI_EN_DMA_RX))
// 外部事件：通知SPI驱动DMA传输结束
void Spi_EvDmaTransCompleted();
#endif

void Spi_Init();

// 传输1个字节
// tx_byte ： 要发送的字节
// 返回： 收到的字节
u8 Spi_TransByte(u8 tx_byte);

// 传输一串数据，传输结束后返回
// rx_buff: 接收数据缓存，当不需要接收时设置为NULL
// tx_buff: 发送数据缓存，当不需要发送时设置为NULL
// len: 传输字节数
bool Spi_Trans(u8 * rx_buff, u8 * tx_buff, u16 len);

#if (_SPI_USE_ASNYC)
// [异步]开始一次SPI传输，传输完毕后触发 SPI_EV_TRANS_COMPLETED 事件
// rx_buff: 接收数据缓存，当不需要接收时设置为NULL
// tx_buff: 发送数据缓存，当不需要发送时设置为NULL
// len: 传输字节数
// 如果启用了DMA传输，需要在DMA传输结束后调用 Spi_EvDmaTransCompleted 。
bool Spi_StartTrans(u8 * rx_buff, u8 * tx_buff, u16 len);

void Spi_SetCallback(spi_cb_t new_cb);

bool Spi_IsBusy();
#endif

#endif
